package com.steve.summary.saga.common.repository;

import com.steve.summary.saga.common.model.Order;
import com.steve.summary.saga.common.status.OrderStatus;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * @Author: STEVE
 * @Description: 订单数据访问接口，继承JpaRepository获得基础CRUD能力
 * <p>
 * 保证每个本地事务的原子性（单个服务的ACID）
 * 提供数据持久化能力
 * 支持事务回滚（通过@Transactional）
 * @since: 2025-05-28
 */
public interface OrderRepository extends JpaRepository<Order, Long> {

    /**
     * 根据用户ID查询订单（Spring Data JPA自动实现）
     * 方法命名遵循规范即可自动生成SQL
     */
    List<Order> findByUserId(Long userId);

    /**
     * 根据状态查询订单（自定义查询）
     */
    List<Order> findByStatus(OrderStatus status);

    /**
     * 更新订单状态（自定义JPQL）
     * 必须加@Modifying和@Transactional注解
     */
    @Modifying
    @Transactional
    @Query("UPDATE Order o SET o.status = :status WHERE o.id = :orderId")
    int updateOrderStatus(Long orderId, OrderStatus status);

    /**
     * 复杂查询示例：查询指定用户未支付的订单
     */
    @Query("SELECT o FROM Order o WHERE o.userId = :userId AND o.status = 'CREATED'")
    List<Order> findUnpaidOrdersByUser(Long userId);

}
